Lambda expression-2

익명 객체를 생성하는 람다식
java는 객체 지향 언어이다. 그런데 람다식은 객체 없이 인터페이스의 구현만으로 메서드를 호출할 수 있다.
java에서는 객체 생성 없이 메서드 호출이 불가능 하기 때문에 익명 객체를 생성한다.
StringConcat concat3=new StringConcat(){
@Override
public void makeString(String s1, String s2){
System.out.println(s1+","+s2);
}
};
따라서 외부 메서드의 지역 변수를 람다식 내부에서 수정하면 오류가 발생한다.
(이는 익명 내부 클래스에서 지역 변수가 상수 처리 되기 때문이다.)
함수를 변수처럼 사용하는 람다식
    인터페이스형 변수에 람다식 대입하기
interface PrintString{
void showString(String str);
}
PrintString lambdaStr=s->System.out.println(s);
lambdaStr.showString("hello lamda_1");
    매개변수로 전달하는 람다식
TestLambda.java
package lambda;
interface PrintString{
void showString(String str);
}
public class TestLambda {
public static void main(String[] args) {
PrintString lambdaStr=s->System.out.println(s);
lambdaStr.showString("hello lamda_1");
//
showMyString(lambdaStr);
}
public static void showMyString(PrintString p) {
p.showString("hello lamda_2");
}
}
    반환값으로 쓰이는 람다식
public static PrintString returnString(){
PrintString str=s->System.out.println(s+"world");
return str;
}
이를 str을 생략하고 간단하게 쓰면 아래와 같다.
public static PrintString returnString(){
return s->System.out.println(s+"world");
}
TestLambda.java
package lambda;
interface PrintString{
void showString(String str);
}
public class TestLambda {
public static void main(String[] args) {
PrintString lambdaStr=s->System.out.println(s);
lambdaStr.showString("hello lamda_1");
showMyString(lambdaStr);
PrintString reStr=returnString();
reStr.showString("hello");
}
public static void showMyString(PrintString p) {
p.showString("hello lamda_2");
}
public static PrintString returnString() {
return s->System.out.println(s+"world");
}
}
위의 3가지 특징을 통해 알 수 있듯이,
함수형 프로그래밍을 통하여서 함수를 마치 변수처럼 사용할 수 있다.
java 8 부터는
java.util.function에서 함수형 인터페이스 표준 API를 제공한다.